﻿#ifndef SWANLINK_FINANCE_CARDSENDER_ADAPTOR_F5G006_LIB_LIBF5G006_INCLUDE_F5G006_API_H
#define SWANLINK_FINANCE_CARDSENDER_ADAPTOR_F5G006_LIB_LIBF5G006_INCLUDE_F5G006_API_H

#if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(WIN32) || defined(_WIN32)
#ifndef F5G006API_EXPORTS
#define F5G006_API __declspec(dllimport)
#else
#define F5G006_API __declspec(dllexport)
#endif
#else   /* Linux */
#define F5G006_API __attribute__((visibility("default")))
#endif
#include <stdint.h>

/**
 * @defgroup ErrorCodes 错误代码定义
 * @{
 */

/** @brief 操作成功 */
#define F5G006_NO_ERROR                 0

/** @brief 设备未找到 (指定的端口号不存在) */
#define F5G006_E_DEV_NOT_FOUND          -1

/** @brief 连接丢失 (当前的连接被强止中断. 请重新建立连接) */
#define F5G006_E_CONN_LOST              -2

/** @brief 设备不可访问 (无权限或者端口号被其它程序占用. 请关闭其它程序后再重试) */
#define F5G006_E_ACCESS                 -4

/** @brief 无效句柄 */
#define F5G006_E_INVALID_HANDLE         -5

/** @brief 参数不正确 */
#define F5G006_E_INVALID_PARAM          -6

/** @brief 无可用内存 */
#define F5G006_E_NO_MEMORY              -7

/** @brief I/O 错误 */
#define F5G006_E_IO_ERROR               -10

/** @brief 通信超时 */
#define F5G006_E_TIMEOUT                -11

/** @brief 未收到传输确认字符ACK（指定的串口号不正确，或者通信故障）*/
#define F5G006_E_NO_ACK                 -12

/** @brief 接收的数据不正确 (通信故障) */
#define F5G006_E_RECEPTION              -13

/** @brief 内部错误 (软件错误或者固件错误) */
#define F5G006_E_INTERNAL_ERROR         -14

/** @brief 未知错误 (调用系统API时返回的未识别的错误) */
#define F5G006_E_UNKNOWN_ERROR          -15

/** @brief 设备掉电 (电压过低或过高) */
#define F5G006_E_POWER_DOWN             -20

/** @brief 发卡箱空 */
#define F5G006_E_SUPPLY_BIN_EMPTY       -21

/** @brief 无发卡箱 */
#define F5G006_E_NO_SUPPLY_BIN          -22

/** @brief 硬件错误 */
#define F5G006_E_HARDWARE_ERROR         -25

/** @brief 无回收箱 */
#define F5G006_E_NO_RETAIN_BIN          -26

/** @brief 回收箱满 */
#define F5G006_E_RETAIN_BIN_FULL        -27

/** @brief 命令失败 */
#define F5G006_E_FAILURE                -30

/** @} */   // end of ErrorCodes


/**
  * @defgroup Constants 常量定义
  * @{
  */

  /**
   * @ingroup Constants
   * @defgroup SBStat 发卡箱状态
   * @{
   */
#define F5G006_SUPPBIN_NOT_PRESENT      0   ///< 未安装（或未安装到位）
#define F5G006_SUPPBIN_EMPTY            1   ///< 卡箱空
#define F5G006_SUPPBIN_LOW              2   ///< 卡箱卡少
#define F5G006_SUPPBIN_HIGH             3   ///< 卡箱卡足
  /** @} */

   /**
    * @ingroup Constants
    * @defgroup RBStat 回收箱状态
    * @{
    */
#define F5G006_RETAINBIN_NOT_PRESENT    0   ///< 未安装（或未安装到位）
#define F5G006_RETAINBIN_NO_CARD_IN     1   ///< 无卡
#define F5G006_RETAINBIN_NOT_FULL       2   ///< 有卡，未满
#define F5G006_RETAINBIN_FULL           3   ///< 有卡，满
  /** @} */


    /**
     * @ingroup Constants
     * @defgroup LogLevel 日志级别
     * @{
     */
#define F5G006_LOGLEVEL_DEBUG      0    ///< 记录通信数据
#define F5G006_LOGLEVEL_INFO       1    ///< 记录函数调用信息
#define F5G006_LOGLEVEL_ERROR      2    ///< 记录错误信息
    /** @} */

  /** @} */  // end of Constants


     /**
       * @defgroup Types 类型定义
       * @{
       */

       /**
        * @brief 操作句柄
        */
typedef void* F5G006_HANDLE;

  /** @} */  // end of Types


#if defined(__cplusplus)
extern "C" {
#endif

  /**
   * @defgroup Functions 函数
   * @{
   */

   /**
    * @brief 使能文件日志输出。
    * @param [in] logsDir  日志输出目录绝对路径。
    * @param [in] fileNamePrefix 日志文件名前缀。
    * @return true 成功, false 失败。
    */
  bool F5G006_API F5G006_EnableFileLog(const char* logsDir, const char* fileNamePrefix);

  /**
   * @brief 关闭文件日志输出。
   */
  void F5G006_API F5G006_DisableFileLog();

  /**
   * @brief 使能控制台日志输出。
   * @return true 成功, false 失败。
   */
  bool F5G006_API F5G006_EnableConsoleLog();

  /**
   * @brief 关闭控制台日志输出。
   */
  void F5G006_API F5G006_DisableConsoleLog();

  /**
   * @brief 设置日志级别。
   * @param [in] level 日志级别。
   * @see LogLevel
   */
  void F5G006_API F5G006_SetLogLevel(int level);


  /**
   * @brief 在调用程序和设备之间建立一个连接。
   * @param portName   串口名。 Windows 平台为 "COMx", 其中x为数字。Linux 平台，该参数为串口设备路径。
   * @param phdev     返回的操作句柄。
   * @return 0 表示成功，其它值表示失败 (see @ref ErrorCodes)。
   */
  int F5G006_API F5G006_Connect(const char* portName, F5G006_HANDLE* phdev);

  /**
   * @brief 断开调用程序和设备之间的连接
   * @param [in] hdev  引用之前调用 F5G006_Connect 返回的句柄
   * @return 0 表示成功，其它值表示失败 (see @ref ErrorCodes)
   */
  int F5G006_API F5G006_Disconnect(F5G006_HANDLE hdev);

  /**
   * @brief 获取设备固件版本信息。
   * @param [in] hdev     引用之前调用 F5G006_Connect 返回的句柄。
   * @param [out] pOutBuf   指向缓冲区的指针。该缓冲区保存读取的固件版本信息（以'\0'结尾）。
   * @param [out] pOutLen   指向整型变量的指针。函数成功后, 该变量的值为固件版本信息的长度。
   * @return 0 表示成功，其它值表示失败 (see @ref ErrorCodes)。
   */
  int F5G006_API F5G006_GetFWVersion(F5G006_HANDLE hdev, char* pOutBuf, int* pOutLen);

  /**
   * @brief 获取传感器信息。
   * @param [in] hdev 引用之前调用 F5G006_Connect 返回的句柄。
   * @param [out] pOutBuf     指向缓冲区的指针。该缓冲区保存读取的传感器数据。
   * @param [out] pOutLen     指向整型变量的指针。函数成功后, 该变量的值为传感器数据的长度。
   * @return 0 表示成功，其它值表示失败 (see @ref ErrorCodes)。
   * @remark 应用不需要调用该函数。请调用 F5G006_GetStatus 获取状态。
   */
  int F5G006_API F5G006_GetSensorInfo(F5G006_HANDLE hdev, uint8_t* pOutBuf, int* pOutLen);

  /**
   * @brief 获取设备状态。
   * @param [in ] hdev    引用之前调用 F5G006_Connect 返回的句柄。
   * @param [out] pSuppBinStat    指向字节变量的指针。函数成功后, 该变量的值为 @ref SBStat 之一。
   * @param [out] pRetainBinStat  指向字节变量的指针。函数成功后, 该变量的值为 @ref RBStat 之一。
   * @return 0 表示成功，其它值表示失败 (see @ref ErrorCodes)。
   */
  int F5G006_API F5G006_GetStatus(F5G006_HANDLE hdev, uint8_t* pSuppBinStat, uint8_t* pRetainBinStat);

  /**
   * @brief 发卡。
   * @param [in] hdev  引用之前调用 F5G006_Connect 返回的句柄。
   * @return 0 表示成功，其它值表示失败 (see @ref ErrorCodes)。
   */
  int F5G006_API F5G006_Dispense(F5G006_HANDLE hdev);

  /**
   * @brief 获取错误信息描述。
   * @param ret 调用其它API时的返回值。
   * @return 错误信息描述。
   */
  F5G006_API const char* F5G006_StrError(int ret);

  /** @} */  // end of Functions

#if defined(__cplusplus)
}
#endif
#endif // SWANLINK_FINANCE_CARDSENDER_ADAPTOR_F5G006_LIB_LIBF5G006_INCLUDE_F5G006_API_H
